package br.com.acs.CameraIP.dao;

import br.com.acs.CameraIP.model.Usuario;
import br.com.acs.CameraIP.util.HibernateUtil;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class UsuarioDaoImp implements UsuarioDao {

	public void save(Usuario nsuario) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t = session.beginTransaction();
		session.merge(nsuario);
		t.commit();
	}

	public Usuario getUsuario(long id) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t = session.beginTransaction();
		t.commit();
		return (Usuario) session.load(Usuario.class, id);
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<Usuario> list() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t = session.beginTransaction();
		List lista = session.createQuery("from Usuario order by id").list();
		t.commit();
		return lista;
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listTodos() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t = session.beginTransaction();
		List<Usuario> lista = session.createQuery(
				"from Usuario usuario order by usuario.login").list();
		t.commit();
		return lista;
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listAtivos() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t = session.beginTransaction();
		List<Usuario> lista = session
				.createQuery(
						"from Usuario usuario where usuario.ativo = 'true' order by usuario.login")
				.list();
		t.commit();
		return lista;
	}

	public void remove(Usuario usuario) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t = session.beginTransaction();
		session.delete(usuario);
		t.commit();
	}

	public void update(Usuario usuario) {

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();

		if (usuario.getPermissao() == null
				|| usuario.getPermissao().size() == 0) {
			Usuario usuarioPermissao = this.getUsuario(usuario.getId());
			usuario.setPermissao(usuarioPermissao.getPermissao());
			session.evict(usuarioPermissao);
		}

		Transaction t = session.beginTransaction();
		session.merge(usuario);
		t.commit();
	}

	public static Session getSession() throws HibernateException {
		Session sess = null;
		try {
			sess = HibernateUtil.getSessionFactory().getCurrentSession();
		} catch (org.hibernate.HibernateException he) {
			sess = HibernateUtil.getSessionFactory().openSession();
		}
		return sess;
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listPorUsername(String usuarioLogado) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t = session.beginTransaction();
		String SQL_QUERY = "select idEmpresa, nomeCompleto " + "from Usuario "
				+ "where username = :username";

		Query query = session.createQuery(SQL_QUERY);
		query.setParameter("username", usuarioLogado);
		List<Usuario> lista = query.list();

		List<Usuario> lista2 = new ArrayList<Usuario>();
		for (Iterator<?> it = lista.iterator(); it.hasNext();) {
			Object[] row = (Object[]) it.next();

			Usuario usuario = new Usuario();
			usuario.setIdCliente((Long) row[0]);
			usuario.setNome((String) row[1]);
			lista2.add(usuario);
		}
		t.commit();
		return lista2;
	}

	public Usuario getUsuarioPorLogin(String login) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Query query = session.createQuery("FROM Usuario WHERE login = :login");
		query.setParameter("login", login);
		return (Usuario) query.uniqueResult();
	}

}
